home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1122 / 1122.xpi / chrome / tabmixplus.jar / content / tabmixplus / links / setup.js < prev    next >
Text File  |  2009-10-07  |  18KB  |  422 lines

  1. /*
  2.  * chrome://tabmixplus/content/links/setup.js
  3.  *
  4.  * original code by Bradley Chapman
  5.  * modified and developped by Hemiola SUN
  6.  * modified again by Bradley Chapman
  7.  *
  8.  */
  9.  
  10. var __contentAreaClick;
  11.  
  12. /**
  13.  * @brief Install the link-handling functions of Tab Mix Plus.
  14.  *
  15.  * @returns        Nothing.
  16.  */
  17. function TMP_TBP_init() {
  18.   var eStrings = document.getElementById("extensionsStrings");
  19.   if (eStrings) {
  20.       // we're in the EM
  21.       openURL = TMP_openURL;
  22.  
  23.       // catch call to tabmix options from EM
  24.       eval("gExtensionsViewController.commands.cmd_options ="+gExtensionsViewController.commands.cmd_options.toString().replace(
  25.       'var optionsURL = aSelectedItem.getAttribute("optionsURL");',
  26.       '$& \ if (TMP_cmd_options(optionsURL)) return;'
  27.       ));
  28.   }
  29.  
  30.   // with MR Tech's local install
  31.   if (typeof(Local_Install) == "object") {
  32.     // use TMP call to TMP Options
  33.     var _aURL = "'chrome://tabmixplus/content/pref/pref-tabmix.xul'";
  34.     eval("Local_Install.createDropDownMenu ="+Local_Install.createDropDownMenu.toString().replace(
  35.     'aMenuItem.setAttribute("oncommand", thisAction + "; event.stopPropagation();");',
  36.     'if (thisAction.indexOf(_aURL) != -1) thisAction = "TMP_cmd_options(" + _aURL + ")"; \ $&'
  37.     ));
  38.   }
  39.  
  40.   // we need this only for use our loadSearchInBackground pref
  41.   var autoComplete = document.getElementById("PopupAutoCompleteRichResult");
  42.   if (autoComplete) {
  43.     eval("autoComplete.onPopupClick ="+autoComplete.onPopupClick.toString().replace(
  44.       'openUILink(url, aEvent);',
  45.       'TMP_BrowserLoadURL(aEvent, null, null, url);'
  46.     ));
  47.   }
  48.  
  49.   if ("contentAreaClick" in window) {
  50.     __contentAreaClick = window.contentAreaClick;
  51.     window.contentAreaClick = TMP_contentAreaClick;
  52.   }
  53.   window.BrowserOpenTab = TMP_BrowserOpenTab;
  54.   window.openUILink = TMP_openUILink;
  55.   // BrowserLoadURL removed in Firefox 3.5
  56.   if ("BrowserLoadURL" in window)
  57.      window.BrowserLoadURL = TMP_BrowserLoadURL;
  58.  
  59.   // for dotCOMplete extensoin
  60.   if ("dotCOMplete" in window)
  61.      window.dotCOMplete.realBrowserLoadURL = TMP_BrowserLoadURL;
  62. }
  63.  
  64. /**
  65.  * @brief Force-call the window observer at least one time.
  66.  *
  67.  * @returns        Nothing.
  68.  */
  69. function TMP_TBP_Startup() {
  70.   try {
  71.     // we can not set this eval in TMP_beforStartup because sometimes
  72.     // TreeStyleTabBrowser don't exist in that early stage, for example when Torbutton is installed
  73.     if ("TreeStyleTabBrowser" in window) {
  74.       eval("TreeStyleTabBrowser.prototype.initTabbar =" + TreeStyleTabBrowser.prototype.initTabbar.toString().replace(
  75.         'var scrollFrame = document.getAnonymousElementByAttribute(b.mTabContainer, "class", "tabs-frame");',
  76.         'var scrollFrame = document.getAnonymousElementByAttribute(b.mTabContainer, "anonid", "scroll-tabs-frame");'
  77.       ));
  78.     }
  79.  
  80.     // session manager extension start to add tab before our onWindowOpen run
  81.     // so we initialize this before start
  82.     gWidthFitTitle = TMP_getBoolPref(tabxBranch, "flexTabs", false) &&
  83.                     (TMP_getIntPref("", "browser.tabs.tabMaxWidth", 250) != gTabmixPrefs.getIntPref("browser.tabs.tabMinWidth"));
  84.  
  85.     gTMPprefObserver.init();
  86.     // force-call the observer once, in order to kill new windows faster
  87.     TMP_DOMWindowOpenObserver.onObserve(window, TMP_DOMWindowOpenObserver);
  88.  
  89.     // make tabmix compatible with ezsidebar extension
  90.     var TMP_BrowserStartup = "__ezsidebar__BrowserStartup" in window ? "__ezsidebar__BrowserStartup" : "BrowserStartup";
  91.     var bowserStartup = window[TMP_BrowserStartup].toString();
  92.  
  93.     if (gIsFirefox35) {
  94.       var pbs = Cc["@mozilla.org/privatebrowsing;1"].
  95.                 getService(Ci.nsIPrivateBrowsingService);
  96.       SessionManager._inPrivateBrowsing = pbs.privateBrowsingEnabled;
  97.  
  98.       bowserStartup = bowserStartup.replace(
  99.         'gBrowser.swapBrowsersAndCloseOther(gBrowser.selectedTab, uriToLoad);',
  100.         'var remoteBrowser = uriToLoad.ownerDocument.defaultView.gBrowser; \
  101.          var url = remoteBrowser.getBrowserForTab(uriToLoad).currentURI.spec; \
  102.          var keepLastTab = tabxPrefs.getBoolPref("keepLastTab"); \
  103.          if (!keepLastTab &&  url != "about:blank") \
  104.            gBrowser.mTabContainer.removeAttribute("hidebutton"); \
  105.          if (!gSingleWindowMode) { \
  106.            window.tabmix_afterTabduplicated = true; \
  107.            $& \
  108.          }'
  109.       );
  110.     }
  111.  
  112.     var stringBundle = document.getElementById("tmp-string-bundle");
  113.     var tabmix_loading = stringBundle.getString("session.loading.label") + "...";
  114.  
  115.     var windowOpeneByTabmix = "tabmixdata" in window;
  116.     var firstWindow = numberOfWindows() == 1;
  117.  
  118.     var disAllow = SessionManager._inPrivateBrowsing || TMP_SessionStore.isSessionStoreEnabled() || "gSessionManager" in window;
  119.     var sessionManager = gTabmixPrefs.getBoolPref("extensions.tabmix.sessions.manager");
  120.     var crashRecovery = gTabmixPrefs.getBoolPref("extensions.tabmix.sessions.crashRecovery");
  121.     var afterRestart = false;
  122.  
  123.     var restoreOrAsk = gTabmixPrefs.getIntPref("extensions.tabmix.sessions.onStart") < 2 || afterRestart;
  124.     var afterCrash = gTabmixPrefs.prefHasUserValue("extensions.tabmix.sessions.crashed");
  125.  
  126.     // don't load home page on first window if session manager or crash recovery is enabled
  127.     window.isLoadHomePage = true;
  128.     if (!disAllow && ((sessionManager && windowOpeneByTabmix) ||
  129.          (firstWindow && crashRecovery && afterCrash) ||
  130.          (firstWindow && sessionManager && restoreOrAsk))) {
  131.       bowserStartup = bowserStartup.replace(
  132.         'uriToLoad = window.arguments[0];',
  133.         'uriToLoad = gHomeButton.getHomePage() == window.arguments[0] ? "about:blank" : window.arguments[0];'
  134.       );
  135.       bowserStartup = bowserStartup.replace(
  136.         'if (window.opener && !window.opener.closed) {',
  137.         'if (uriToLoad && uriToLoad != "about:blank")\
  138.            for (var i = 0; i < gBrowser.mTabContainer.childNodes.length ; i++)\
  139.              gBrowser.mTabContainer.childNodes[i].loadOnStartup = true;\
  140.          $&'
  141.       );
  142.       if (!("TabGroupsManagerApiVer1" in window)) {
  143.         bowserStartup = bowserStartup.replace(
  144.           'if (window.opener && !window.opener.closed) {',
  145.           'if (uriToLoad == "about:blank" || "tabmixdata" in window) {\
  146.             var aBrowser = gBrowser.selectedBrowser;\
  147.             aBrowser.contentDocument.title = tabmix_loading;\
  148.             aBrowser.mIconURL = "chrome://tabmixplus/skin/tmp.png";\
  149.             gBrowser.mCurrentTab.setAttribute("image", aBrowser.mIconURL);\
  150.           }\
  151.           $&'
  152.         );
  153.       }
  154.     }
  155.  
  156.     // call TMP_SessionStore.setService before delayedStartup, so this will run before sessionStore.init
  157.     eval("window."+TMP_BrowserStartup+" ="+bowserStartup.replace(
  158.       'setTimeout(delayedStartup, 0',
  159.       'if (numberOfWindows() == 1) TMP_SessionStore.setService(1, true); \
  160.        $&'
  161.     ));
  162.  
  163.     // look for installed extensions that are incompatible with tabmix
  164.     if (gTabmixPrefs.getBoolPref("extensions.tabmix.disableIncompatible")) {
  165.       if (typeof(PlacesController) == "function")
  166.         window.setTimeout(disableExtensions, 3000, window);
  167.       else
  168.         disableExtensions();
  169.     }
  170.  
  171.    // add tabmix menu item to tab context menu before menumanipulator and MenuEdit initialize
  172.     TM_creatMenuItems();
  173.  
  174.     // if nglayout.debug.disable_xul_cache == true sometimes sessionHistory act strange
  175.     // especially with many extensions installed
  176.     var pref = "nglayout.debug.disable_xul_cache";
  177.     if ((!firstWindow && !windowOpeneByTabmix) && gTabmixPrefs.prefHasUserValue(pref) && gTabmixPrefs.getBoolPref(pref))
  178.       window.setTimeout(window[TMP_BrowserStartup], 0);
  179.     else
  180.       window[TMP_BrowserStartup]();
  181.  
  182.     return;
  183.   } catch (ex) {TMP_ASSERT(ex);}
  184. }
  185.  
  186. function TMP_delayedStartup() {
  187.   if (gIsFirefox35)
  188.     gBrowser.mTabContainer._newTabButtonWidth = gBrowser.mTabContainer.mTabsNewtabButton.boxObject.width;
  189.  
  190.   SessionManager.init();
  191.   TMP_ClosedTabs.setButtonDisableState();
  192.   gBrowser.mTabContainer.nextTab = 1;
  193.   // convert session.rdf to SessionManager extension format
  194.   convertSession.startup();
  195.  
  196.   // set title at startup if we not use session manager
  197.   // startup page or home page load before bookmarks service
  198.   var i;
  199.   if (gTabmixPrefs.getBoolPref("extensions.tabmix.titlefrombookmark")) {
  200.     for (i = 0; i < gBrowser.mPanelContainer.childNodes.length ; i++) {
  201.       var aBrowser = gBrowser.getBrowserAtIndex(i);
  202.       var aUrl = aBrowser.contentDocument.baseURI;
  203.       aUrl = (aUrl) ? aUrl : aBrowser.currentURI.spec ;
  204.       var bookMarkName = getTitleFromBookmark(aUrl);
  205.       if (bookMarkName && aBrowser.contentDocument.title != bookMarkName)
  206.         aBrowser.contentDocument.title = bookMarkName;
  207.     }
  208.   }
  209.  
  210.   var toolbox = document.getElementById("navigator-toolbox");
  211.   _BrowserToolboxCustomizeDone = toolbox.customizeDone;
  212.   toolbox.customizeDone = function TMP_customizeDone(aToolboxChanged) {
  213.     _BrowserToolboxCustomizeDone(aToolboxChanged);
  214.     try {
  215.       if (aToolboxChanged)
  216.         TMP_BrowserToolboxCustomizeDone();
  217.       // if tabmix option dialog is open update visible buttons and set focus if needed
  218.       var optionWindow = gWindowManager.getMostRecentWindow("mozilla:tabmixopt");
  219.       if (optionWindow) {
  220.         optionWindow.toolbarButtons(window);
  221.         if ("_tabmixCustomizeToolbar" in optionWindow) {
  222.           delete optionWindow._tabmixCustomizeToolbar;
  223.           optionWindow.focus();
  224.         }
  225.       }
  226.     } catch (ex) {TMP_ASSERT(ex, "error in TMP_BrowserToolboxCustomizeDone");}
  227.   };
  228.  
  229.   // when we open bookmark in new window
  230.   // get bookmark itemId and url - for use in getBookmarkTitle
  231.   if ("bookMarkIds" in window) {
  232.     var items = window.bookMarkIds.split("|");
  233.     for (i = 0; i < items.length ; i++) {
  234.       if (items[i] && items[i] > -1)
  235.         gBrowser.mTabContainer.childNodes[i].setAttribute("tabmix_bookmarkId", items[i]);
  236.     }
  237.     delete window.bookMarkIds;
  238.   }
  239. }
  240.  
  241. // this must run before all
  242. function TMP_beforStartup(tabBrowser, aTabContainer) {
  243.     // ODFReader change Cc to something else maybe some other extensions do that too !!!
  244.     if ("Cc" in window && Cc != Components.classes)
  245.        Cc = Components.classes;
  246.  
  247.     if ("Ci" in window && Ci != Components.interfaces)
  248.        Ci = Components.interfaces;
  249.  
  250.     // fix bug in backgroundsaver extension
  251.     // that extension use function with the name getBoolPref
  252.     // we replace it back here
  253.     if ("bgSaverInit" in window && "getBoolPref" in window &&
  254.             getBoolPref.toString().indexOf("return bgSaverPref.prefHasUserValue(sName)") != -1) {
  255.        window.getBoolPref = function getBoolPref ( prefname, def ) {
  256.           try {
  257.              var pref = Components.classes["@mozilla.org/preferences-service;1"]
  258.                        .getService(Components.interfaces.nsIPrefBranch);
  259.              return pref.getBoolPref(prefname);
  260.           }
  261.           catch(er) { return def; }
  262.        }
  263.     }
  264.  
  265.     var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
  266.                      .getService(Components.interfaces.nsIXULAppInfo);
  267.     var versionChecker = Components.classes["@mozilla.org/xpcom/version-comparator;1"]
  268.                      .getService(Components.interfaces.nsIVersionComparator);
  269.     gIsFirefox35 = versionChecker.compare(appInfo.version, "3.1a2") > 0;
  270.     gIsFirefox36 = versionChecker.compare(appInfo.version, "3.6a1pre") >= 0;
  271.     gIsFirefox37 = versionChecker.compare(appInfo.version, "3.7a1pre") >= 0;
  272.     gisToolbarMode = "mTabDropIndicator" in tabBrowser;
  273.  
  274.     // fix conflict with Lori extension
  275.     // and fix bug in Lori extension that prevent it from closing unread tabs
  276.     if ("loriOldRemoveTab" in tabBrowser) {
  277.       tabBrowser.removeTab = tabBrowser.loriOldRemoveTab;
  278.       delete tabBrowser.loriOldRemoveTab;
  279.       eval("tabBrowser.removeTab ="+tabBrowser.removeTab.toString().replace(
  280.          'var index = -1;',
  281.          'var b = this.getBrowserForTab(aTab); \
  282.           if ("loriTabListener" in b) { \
  283.             b.loriTabListener.destroy(); \
  284.             b.loriTabListener = null; \
  285.           } \ $&'
  286.       ));
  287.     }
  288.  
  289.     // we call this here before some other extensions (like Highlander) change handleLinkClick
  290.     // don't call openNewWindowWith when we are in single window mode
  291.     eval("handleLinkClick ="+handleLinkClick.toString().replace(
  292.        'if (event.shiftKey)',
  293.        'if (gSingleWindowMode && event.shiftKey) { \
  294.            openNewTabWith(href, doc, null, event, false); \
  295.            event.stopPropagation(); \
  296.            return true; \
  297.         } \
  298.         $&'
  299.     ).replace(
  300.        'if (tab)',
  301.        'if (gSingleWindowMode || tab)'
  302.     ));
  303.  
  304.     // remove call to "arrowscrollbox" by "this.mTabContainer.mTabstrip" we don't use it in tabmix
  305.     eval("tabBrowser.moveTabTo ="+tabBrowser.moveTabTo.toString().replace(
  306.          'this.mTabContainer.mTabstrip.scrollBoxObject.ensureElementIsVisible(this.mCurrentTab);',
  307.          ''
  308.     ));
  309.  
  310.     var tabContainer = aTabContainer || tabBrowser.mTabContainer ||
  311.                        document.getAnonymousElementByAttribute(tabBrowser, "anonid", "tabcontainer");
  312.  
  313.     if (gIsFirefox36) {
  314.       eval("tabBrowser.addTab ="+tabBrowser.addTab.toString().replace(
  315.            'this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();',
  316.            ''
  317.       ));
  318.  
  319.       // nsSessionStore.js use this
  320.       tabContainer.mTabstrip.__defineGetter__("scrollClientSize", function() {
  321.         return tabContainer.mTabstrip.clientWidth;
  322.       });
  323.     }
  324.     else
  325.       eval("tabBrowser.addTab ="+tabBrowser.addTab.toString().replace(
  326.            'aTabContainer.mTabstrip._updateScrollButtonsDisabledState();',
  327.            ''
  328.           ).replace(
  329.            'this.mTabContainer.mTabstrip.scrollBoxObject.scrollBy(this.mTabContainer.firstChild.boxObject.width, 0);',
  330.            ''
  331.       ));
  332.  
  333.     if (gIsFirefox35) {
  334.        // for Firefox 3.5+ //
  335.        eval("tabBrowser._endRemoveTab ="+tabBrowser._endRemoveTab.toString().replace(
  336.             'setTimeout(_delayedUpdate, 0, this.tabContainer);',
  337.             ''
  338.           ).replace(
  339.            'this.tabContainer.mTabstrip._updateScrollButtonsDisabledState();',
  340.            ''
  341.        ));
  342.  
  343.        tabContainer._fillTrailingGap = function() { }
  344.        tabContainer.mTabstrip.scrollBoxObject = tabContainer.tabstrip.boxObject;
  345.     }
  346.     else {
  347.        // for Firefox 3.0.x //
  348.        eval("tabBrowser.removeTab ="+tabBrowser.removeTab.toString().replace(
  349.             'setTimeout(_delayedUpdate, 0, this.mTabContainer);',
  350.             ''
  351.            ).replace(
  352.             'tabStrip.scrollBoxObject.getPosition(scrollPos, {});',
  353.             'scrollPos.value = -tabStrip.boxObject.width;'
  354.            ).replace(
  355.             'tabStrip.scrollBoxObject.getScrolledSize(scrolledSize, {});',
  356.             'scrolledSize.value = 2000;'
  357.        ));
  358.     }
  359.  
  360.     // return true if all tabs in the window are blank
  361.     tabBrowser.isBlankWindow = function() {
  362.        for (var i = 0; i < this.mTabs.length; i++) {
  363.           if (!this.isBlankBrowser(this.getBrowserAtIndex(i)))
  364.              return false;
  365.        }
  366.        return true;
  367.     }
  368.  
  369.     tabBrowser.isBlankTab = function(aTab) {
  370.       return this.isBlankBrowser(this.getBrowserForTab(aTab));
  371.     }
  372.  
  373.     tabBrowser.isBlankNotBusyTab = function TMP_isBlankNotBusyTab(aTab) {
  374.        if (aTab.hasAttribute("busy"))
  375.           return false;
  376.  
  377.        return this.isBlankBrowser(this.getBrowserForTab(aTab));
  378.     }
  379.  
  380.     tabBrowser.isBlankBrowser = function _isBlankBrowser(aBrowser) {
  381.        try{
  382.           if (!aBrowser)
  383.              return true;
  384.           return (!aBrowser.sessionHistory || aBrowser.sessionHistory.index < 0 ||
  385.                   (aBrowser.sessionHistory.count < 2 &&
  386.                   (!aBrowser.currentURI || aBrowser.currentURI.spec == 'about:blank')));
  387.        } catch (ex) {TMP_ASSERT(ex); return true;}
  388.     }
  389.  
  390.     if (gisToolbarMode) { // after bug 347930 (not drop on trunk yet)
  391.       tabContainer.removeEventListener("overflow", tabBrowser, false);
  392.       tabContainer.removeEventListener("underflow", tabBrowser, false);
  393.        // mTabDropIndicatorBar removed
  394.       tabBrowser.mTabDropIndicatorBar = tabBrowser.mTabDropIndicator.parentNode;
  395.     }
  396.     else {
  397.       tabContainer.mTabstrip.removeEventListener("overflow", tabContainer, false);
  398.       tabContainer.mTabstrip.removeEventListener("underflow", tabContainer, false);
  399.     }
  400.  
  401.     if (tabContainer.mAllTabsPopup && "_updateTabsVisibilityStatus" in tabContainer.mAllTabsPopup) {
  402.       eval("tabContainer.mAllTabsPopup._updateTabsVisibilityStatus ="+tabContainer.mAllTabsPopup._updateTabsVisibilityStatus.toString().replace(
  403.          'var tabstripBO = tabContainer.mTabstrip.scrollBoxObject;',
  404.          'var tabstripBO = tabContainer.tabstrip.boxObject;'
  405.       ));
  406.     }
  407.  
  408.     // remove tabs-newtab-button after last tab for firefox 3.0
  409.     if (!gIsFirefox35) {
  410.       var newTabButton = document.getAnonymousElementByAttribute(tabContainer, "class", "tabs-newtab-button");
  411.       if (newTabButton)
  412.         newTabButton.parentNode.removeChild(newTabButton);
  413.     }
  414.  
  415.     try {
  416.       if ("TabGroupsManagerApiVer1" in window)
  417.         TMP_TabGroupsManager.init(tabContainer);
  418.     } catch (ex) {TMP_ASSERT(ex);}
  419.  
  420.     TMP_eventListener.init(tabContainer);
  421. }
  422.